#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

#define MAX_HISTORY 10
#define MAX_FILESIZE 1024*1024*200

int main() {

    // 定义目录名
    char dirname[] = "nohup_log";
    char logs[10][128] = { 
        "nohup_log/nohup.log", 
        "nohup_log/nohup.log.1", 
        "nohup_log/nohup.log.2", 
        "nohup_log/nohup.log.3", 
        "nohup_log/nohup.log.4", 
        "nohup_log/nohup.log.5", 
        "nohup_log/nohup.log.6", 
        "nohup_log/nohup.log.7", 
        "nohup_log/nohup.log.8", 
        "nohup_log/nohup.log.9" 
    };
    // 判断目录是否存在
    struct stat st;
    if (stat(dirname, &st) == -1) {
        // 目录不存在，则创建
        int ret = mkdir(dirname, 0755);
        if (ret != 0) {
            perror("mkdir");
            return -1;
        }
    } 

    // 定义文件句柄
    // 在当前目录下建立 nohup_log目录
    FILE *fp = fopen(logs[0], "a+");
    if (fp == NULL) {
        perror("fopen");
        return -1;
    }

    // 读取标准输出
    char buf[1024];
    while (fgets(buf, sizeof(buf), stdin) != NULL) {
        // 写入文件
        fprintf(fp, "%s", buf);
        long file_size = ftell(fp);
        if (file_size > MAX_FILESIZE) {
            // 关闭当前文件
            fclose(fp);
            // 对于存在的文件进行处理
            for (int i = 9;i>0;i--) {
                // 判断 nlog.9 文件是否存在
                if(i == 9) {
                    // 删除 nlog.9 文件
                    int ret = remove(logs[i]);
                    if (ret != 0) {
                        perror("remove");
                        return -1;
                    }
                    continue;
                }
                struct stat st;
                if (stat(logs[i], &st) == -1) {
                    // 文件不存在，则无需处理
                    rename(logs[i], logs[i+1]);
                }
            }
            fp = fopen(logs[0], "a+");
        }
    }
}